﻿using System;
using System.Windows.Interactivity;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using System.Windows;

using Mandarine.Util;

namespace Mandarine.Controls.ApplicationBar
{
    /// <summary>
    /// アプリケーションバーアイテム用のビヘイビアクラスを提供します
    /// </summary>
    public abstract class AppBarItemBehavior : Behavior<PhoneApplicationPage>
	{
        protected IApplicationBarMenuItem _item;

        /// <summary>
        /// アプリケーションバーアイテムのタイプ(ボタン|メニュー)
        /// </summary>
        public AppBarItemType Type { get; set; }

        /// <summary>
        /// アプリケーションバーアイテムを一意に取得するためのID値(アイテムのTextプロパティ)
        /// </summary>
        public string Id { get; set; }

        #region Text dependency property

        /// <summary>
        /// アプリケーションバーアイテムのテキスト(Text)とバインドする同名の依存プロパティ
        /// </summary>
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text"
            , typeof(string)
            , typeof(AppBarItemBehavior)
            , new PropertyMetadata((s, args) =>
            {
                var b = (AppBarItemBehavior) s;
                if (b._item != null && !String.IsNullOrWhiteSpace(b.Text))
                {
                    //自身のTextプロパティ変更時に同期
                    b._item.Text = b.Text;
                }
            }));

        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        #endregion

        /// <summary>
        /// アイテムがクリックされた際に呼ばれるコールバックメソッド
        /// </summary>
        private void ItemClickCallBack(Object sender, EventArgs e)
        {
            OnItemClick();
        }
        /// <summary>
        /// サブクラスで実装するアプリケーションバーアイテムのクリック委譲メソッド
        /// </summary>
        protected abstract void OnItemClick();

        protected override void OnAttached()
        {
            _item = AssociatedObject.ApplicationBar.FindItem(Type, Id);

            if (_item != null)
            {
                _item.Click += ItemClickCallBack;

                if (Text.IsNotEmpty())
                {
                    _item.Text = Text;
                }
            }

            base.OnAttached();
        }

        protected override void OnDetaching()
        {
            if (_item != null)
            {
                _item.Click -= ItemClickCallBack;
            }

            base.OnDetaching();
        }

    }
}
